//Grunt的入口文件
//用于定义一些需要 Grunt 自动执行的任务
//需要导出一个函数
//此函数接收一个 Grunt 的形参，内部提供一些创建任务时可以用到的API


//Grunt的基本使用
// module.exports = grunt => { 
//     // 注册任务(创建任务)--->grunt.registerTask
//     //第一个参数为任务的名字,第二个参数可以指定一个任务函数(任务发生时自动执行得到函数)
//     //提供yarn grunt foo运行后输出hello grunt
//     grunt.registerTask('foo', () => { 
//         console.log('hello grunt');
//     })

//     //如果第二个参数为字符串那么会成为描述信息,他会出现在grunt的帮助信息当中
//     //可以通过yarn grunt --help去得到grunt的帮助信息
//     //也可以通过yarn grunt bar 运行这个任务
//     grunt.registerTask('bar', '任务描述', () => {
//         console.log('other task~');
//     })
    

//     //如果任务名称叫default,那么这个任务将会成为grunt的默认任务,提供yarn grunt即可运行
//     // grunt.registerTask('default', () => { 
//     //     console.log('default');
//     // })

//     //一般default的做法是去映射一些任务,第二个参数为数组,那么就会依次执行这些方法
//     grunt.registerTask('default', ['foo', 'bar'])
    

//     //grunt代码默认执行同步模式,如果需要执行异步代码需要使用this.async
//     grunt.registerTask('async-task', function () { 
//         const done = this.async()
//         setTimeout(() => {
//             console.log('async');
//             //调用这个函数标识这个任务已经完成
//             done()
//         }, 1000);
//     })
// }

// =================================================================================

//Grunt标记任务失败
// module.exports = grunt => { 
//     //通过return false 标记任务失败,那么执行这个任务的时候就会报错
//     grunt.registerTask('bad', () => { 
//         console.log('bad');
//         return false
//     })

//     grunt.registerTask('foo', () => { 
//         console.log('foo');
    
//     })
    
//      grunt.registerTask('bar', () => { 
//         console.log('bar');
        
//      })
//     //但是通过return  fault  方法时，在下面default方法中会导致后面的方法无法执行
//     //或者可以通过yarn grunt default --force就是第一个错误后面的任务也可以正常执行
//     grunt.registerTask('default', ['bad', 'foo', 'bar'])
    

//     //如果是异步任务就无法通过return false标记任务失败
//     //可以通过在异步的回调函数传入一个实参false
//     grunt.registerTask('async', function () { 
//         const done = this.async()
//         setTimeout(() => {
//             console.log('async');
//             done(false)
//         }, 1000);
//     })
// }


// =================================================================================


//配置方法(配置任务)
// module.exports = grunt => { 
//     grunt.initConfig({
//         foo:'bar'
//     })

//     grunt.registerTask('foo', () => { 
//         //通过grunt.config()可以获取配置数据
//         console.log(grunt.config('foo'));
//     })
// }


// =================================================================================


// 多目标任务
module.exports = grunt => { 
    grunt.initConfig({
        //这里的build需要和下面的任务名同名
        build: {
            //这是配置选项，不会再执行的时候被target和data获取,但是可以通过this.options()方法获取
            options: {
                foo:'bar'
            },
            css: '1',
            js: '2',
            html: {
                options: {
                    foo:'bar'
                }
            }
        }
    })

    //多目标模式,可以让任务根据配置形成多个子任务
    //需要grint.initConfig创建任务
    //可以通过yarn grunt build 运行多个任务
    //也可以通过yarn grunt build:css 运行单个任务(这里的css是上面定义的key)
    grunt.registerMultiTask('build', function(){ 
        console.log('build task');
        //可以通过this.target 和  this.data获取配置数据
        console.log(`target:${this.target},data:${this.data}`)
        //获取配置方法
        console.log(this.options())
    })
}


// =================================================================================

// 插件
//比如grunt-contrib-clean插件
//通过yarn add grunt-contrib-clean安装
//通过yarn grunt clean  对应的文件就会被清除
module.exports = grunt => { 
    grunt.initConfig({
        clean: {
            //这是删除某一个文件
            // temps: 'temp/add.js'
            //也可以使用通配符,代表删除所有js文件
            // temp:'temp/*.js'
            //或者**代表所有文件---temp下的所有文件
            // temp:'temp/**'
        }
    })
    grunt.loadNpmTasks('grunt-contrib-clean')
}